/*
 * Niiuzu
 * Copyright (C) 2011  Thierry Nowak
 * 
 * This program is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.niiuzu.client.eventbus;

import com.google.gwt.user.client.ui.IsWidget;
import com.mvp4g.client.annotation.Event;
import com.mvp4g.client.annotation.Events;
import com.mvp4g.client.annotation.Start;
import com.mvp4g.client.annotation.module.ChildModule;
import com.mvp4g.client.annotation.module.ChildModules;
import com.mvp4g.client.event.EventBus;
import com.niiuzu.client.module.AuthentificationModule;
import com.niiuzu.client.module.FeedModule;
import com.niiuzu.client.screen.application.ApplicationPresenter;
import com.niiuzu.client.screen.application.ApplicationViewImpl;
import com.niiuzu.client.screen.application.home.HomePresenter;
import com.niiuzu.client.util.LoadingTicket;

/**
 * EventBus principal de l'application.
 */
@Events(startView = ApplicationViewImpl.class)
@ChildModules( {
		@ChildModule(moduleClass = AuthentificationModule.class, autoDisplay = false),
		@ChildModule(moduleClass = FeedModule.class, autoDisplay = false) })
public interface ApplicationEventBus extends EventBus, CommonEventBus {

	/**
	 * Un nouvel utilisateur vient d'accéder à l'application. Remarque : il ne
	 * s'agit pas ici de la connexion à un compte utilisateur mais bien du
	 * démarrage de l'application.
	 * 
	 * @see ApplicationPresenter#onUserEnteredInApplication()
	 */
	@Start
	@Event(handlers = ApplicationPresenter.class)
	void userEnteredInApplication();

	/**
	 * Le chargement de la page d'accueil a été demandé.
	 * 
	 * @see HomePresenter#onHomeLoadStarting()
	 */
	@Event(handlers = HomePresenter.class)
	void homeLoadStarting();

	/**
	 * La page d'accueil est chargée.
	 * 
	 * @see ApplicationPresenter#onHomeLoaded(IsWidget)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void homeLoaded(IsWidget widget);

	/**
	 * L'utilisateur souhaite accéder au formulaire de connexion.
	 * 
	 * @see AuthentificationEventBus#logInFormWanted()
	 */
	@Event(modulesToLoad = AuthentificationModule.class)
	void logInFormWanted();

	/**
	 * L'utilisateur souhaite créer un compte.
	 * 
	 * @see AuthentificationEventBus#signUpFormWanted()
	 */
	@Event(modulesToLoad = AuthentificationModule.class)
	void signUpFormWanted();

	/**
	 * L'utilisateur vient de s'authentifier.
	 * 
	 * @see ApplicationPresenter#onUserLoggedIn(LoadingTicket)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void userLoggedIn(LoadingTicket ticket);

	/**
	 * Le chargement du gestionnaire des flux a été demandé.
	 * 
	 * @see FeedEventBus#feedMainViewLoadStarting(LoadingTicket)
	 */
	@Event(modulesToLoad = FeedModule.class)
	void feedMainViewLoadStarting(LoadingTicket ticket);

	/**
	 * La vue du gestionnaire des flux est chargée.
	 * 
	 * @see ApplicationPresenter#onFeedMainViewLoaded(IsWidget, LoadingTicket)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void feedMainViewLoaded(IsWidget widget, LoadingTicket ticket);

	/**
	 * Une erreur a été déclenchée au sein de l'application.
	 * 
	 * @see ApplicationPresenter#onTechnicalErrorOccurred(Throwable)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void technicalErrorOccurred(Throwable caught);

	/**
	 * Un message d'erreur non technique vient d'être envoyé.
	 * 
	 * @see ApplicationPresenter#onBusinessErrorOccurred(String)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void businessErrorOccurred(String errorMessage);

	/**
	 * Le chargement d'un traitement asynchrone vient d'être lancé (ex: appel
	 * d'un service RPC). Un ticket est envoyé au presenter en charge de cet
	 * événement afin de pouvoir gérer plusieurs chargements en même temps en
	 * gardant une référence de chacun de ces chargements.
	 * 
	 * @param ticket
	 *            référence du chargement venant de commencer.
	 * 
	 * @see ApplicationPresenter#onLoadingStarted(LoadingTicket)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void loadingStarted(LoadingTicket ticket);

	/**
	 * Le chargement asynchrone lancé auparavant vient de se terminer.
	 * 
	 * @param ticket
	 *            référence du chargement lancé plus tôt.
	 * 
	 * @see ApplicationPresenter#onLoadingFinished(LoadingTicket)
	 */
	@Event(handlers = ApplicationPresenter.class)
	void loadingFinished(LoadingTicket ticket);

}
